/*
 * @(#)org.example.netty.groupchat 2020/4/2/0002
 *
 * Copy Right@ 人人译视界
 */


package org.example.netty.groupchat;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

import java.text.SimpleDateFormat;

/**
 * <pre>
 * @author tuwei
 *
 * @version 0.9
 *
 * 修改版本: 0.9
 * 修改日期: 2020/4/2/0002
 * 修改人 :  tuwei
 * 修改说明: 初步完成
 * 复审人 ：
 * </pre>
 */
public class GroupChatServerHandler extends SimpleChannelInboundHandler<String> {
	// 定义一个全局的事件监听器
	private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

	// 表示连接建立，一旦连接，第一个被执行
	// 将channel加入到channelGroup中
	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		Channel channel = ctx.channel();
		// 将该客户加入到聊天的信息推送给其它在线的客户端
		channelGroup.writeAndFlush("[客户端]" + channel.remoteAddress() + "加入聊天\n");
		channelGroup.add(channel);
	}

	// 表示channel处于活动状态，表示xx处于上线
	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		System.out.println(ctx.channel().remoteAddress() + "上线了");
	}

	// 表示channel处于非活动状态
	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		System.out.println(ctx.channel().remoteAddress() + "下线了");
	}

	// 表示channel断开连接，并且netty会自动将其从channelGroup中移除
	@Override
	public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
		channelGroup.writeAndFlush(ctx.channel().remoteAddress() + "离开了\n");
		System.out.println("channelGroup size=" + channelGroup.size());
	}

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
		Channel channel = ctx.channel();
		ChannelPipeline pipeline = channel.pipeline();
		channelGroup.forEach(ch -> {
			if (ch.equals(channel)) {
				ch.writeAndFlush("[自己]发送的消息：" + msg);
			}
			else {
				ch.writeAndFlush("[客户]" + channel.remoteAddress() + "发送的消息：" + msg);
			}
		});
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		channelGroup.close();
	}
}
